package com.jinhongone.pattern.structure.proxy.jdk_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {
    //真实主题(被代理对象)
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public SellTickets getSellTickets() {
        //jdk提供Proxy类创建动态代理
        /*
          ClassLoader loader, 目标对象的类加载器
          Class<?>[] interfaces, 目标对象实现的接口
          InvocationHandler h 调用处理器
        * */
        SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    /*
                        Object proxy, 最终产生的代理对象 == sellTickets
                        Method method, 代理对象调用的方法
                        Object[] args，方法形参
                    * */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //代理对象调用方法会调用本调用处理器
                        System.out.println("jdk-动态代理生成代理对象（前置增加逻辑）");
                        Object invoke = method.invoke(target, args); //调用目标方法，并将结果返回
                        System.out.println("jdk-动态代理生成代理对象（后置增加逻辑）");
                        return invoke; //方法返回
                    }
                }

        );
        return sellTickets;
    }
}
